---
sidebar_position: 4
---
# Agents

代理的核心思想是使用LLM来选择要采取的一系列动作。
在链式结构中，一系列动作是硬编码的（在代码中）。
在代理中，使用语言模型作为推理引擎来确定要采取的动作及其顺序。

这里有几个关键组件：

## 代理

这是负责决定下一步采取什么动作的类。
这是由语言模型和提示驱动的。
该提示可以包括以下内容：

1. 代理的个性（对于以某种方式响应很有用）
2. 代理的背景上下文（对于给予其更多关于所要求完成的任务类型的上下文很有用）
3. 调用更好推理的提示策略（最著名/广泛使用的是[ReAct](https://arxiv.org/abs/2210.03629)）

LangChain提供了几种不同类型的代理来入门。
即使如此，您可能还希望使用部分（1）和（2）自定义这些代理。
有关代理类型的完整列表，请参见[代理类型](/docs/modules/agents/agent_types/)

## 工具

工具是代理调用的函数。
这里有两个重要的考虑因素：

1. 给代理访问正确工具的权限
2. 以对代理最有帮助的方式描述工具

如果没有这两者，您想要构建的代理将无法工作。
如果您不给代理访问正确工具的权限，它将永远无法完成目标。
如果您不正确描述工具，代理将不知道如何正确使用它们。

LangChain提供了一系列广泛的工具来入门，同时也可以轻松定义自己的工具（包括自定义描述）。
有关工具的完整列表，请参见[这里](/docs/modules/agents/tools/)

## 工具包

代理可以访问的工具集合通常比单个工具更重要。
为此，LangChain提供了工具包的概念-用于实现特定目标所需的一组工具。
通常一个工具包中有3-5个工具。

LangChain提供了一系列广泛的工具包来入门。
有关工具包的完整列表，请参见[这里](/docs/modules/agents/toolkits/)

## 代理执行器

代理执行器是代理的运行时。
这是实际调用代理并执行其选择的动作的部分。
以下是此运行时的伪代码：

```python
next_action = agent.get_action(...)
while next_action != AgentFinish:
    observation = run(next_action)
    next_action = agent.get_action(..., next_action, observation)
return next_action
```

虽然这看起来很简单，但此运行时为您处理了几个复杂性，包括：

1. 处理代理选择不存在的工具的情况
2. 处理工具发生错误的情况
3. 处理代理生成无法解析为工具调用的输出的情况
4. 在所有级别上记录和可观察性（代理决策，工具调用）-可以输出到stdout或[LangSmith](https://smith.langchain.com)

## 其他类型的代理运行时

`AgentExecutor`类是LangChain支持的主要代理运行时。
然而，我们还支持其他更实验性的运行时。
包括：

- [计划和执行代理](/docs/modules/agents/agent_types/plan_and_execute.html)
- [Baby AGI](/docs/use_cases/autonomous_agents/baby_agi.html)
- [Auto GPT](/docs/use_cases/autonomous_agents/autogpt.html)

## 入门

import GetStarted from "@snippets/modules/agents/get_started.mdx"

<GetStarted/>

